Skip to main content

8. ABI 摘要(ABI v0.1)

完整定义见本目录「Shader ABI」各章。

  • 代码对象:shader 为位置无关代码(PC = 相对 CODE_BASE 的 32 位偏移)。编译器输出前导/主体/尾声三个可选段,驱动 memcpy 拼接为一个代码对象(8-byte 指令对齐、段起始 16-byte 对齐),前段末尾直接落入下段,无隐式跳转;jal 链接值 = PC+4。段元数据含 ISA/ABI 版本、入口偏移、代码长度、v/u 上界、scratch 字节数、描述符集合、waitcnt 上界与可选能力;驱动提交前检查,不支持的 optional 指令不得静默执行。
  • 入口状态:u0:u1 根表指针;u2–u9 descriptor set 0–3 基址;u10–u25 前 16 个 dword push constants;u26–u28 workgroup id;u29 subgroup/warp id;u30–u31 驱动保留(须声明);v0 = compute packed local id(10:10:10)。fragment:v0 像素 xy、v1 coverage、v2 sample id/front-facing、v3 primitive id。
  • 调用约定:caller-saved v0–v31、u16–u31;callee-saved v32–v127、u32–u59(返回前恢复);u60 ABI/驱动 scratch、u61 保留;u62 = 返回地址(jal/jalr 推荐 rd=u62)、u63 = 当前帧 scratch 字节偏移(不得当全局指针)。64 位对偶数对齐,保存规则对两半同时适用。被调用者不得假设 EXEC 全 1;返回前须清空本函数发起的异步队列(或等价 waitcnt)。
  • scratch 与描述符:每 lane scratch 为私有字节数组(基址 scratch_lo/hi,u63 帧偏移);spill/局部数组 16-byte 对齐;越界按 bounds_checked 规则。描述符指针须满足 udesc4/udesc8 对齐;null/OOB load 返回全零(可返回 residency code),store/atomic 丢弃;非一致 descriptor index 必须由编译器 waterfall。
  • 段接口:VS 前导输出的属性从 v8 起、每 location 连续 4 寄存器;FS 尾声读 render target i 的 RGBA 于 v[4i..4i+3]、深度 v32、模板 v33、sample mask v34。段边界不改变寄存器文件、EXEC、MODE、fflags 或 pending waitcnt;段间只经约定寄存器传值。
  • 并发与版本:函数返回不得遗留未完成异步副作用(store 等 vst、load/返回原子等 vm/tex、SFU 等 sfu);workgroup 屏障由调用者保证全部活跃 warp 到达。trap 现场含段编号、拼接后 PC、EXEC 与 scratch 指针。对象头写 abi_version=0.1、isa_version=0.1;旧驱动遇到未知 flag、optional 能力或非零保留字段必须拒绝对象。